package com.example.demo.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.*;

/**
 * @description：对象克隆工具.
 * @author：lw
 * @create_time：2024/1/17
 **/
public class ObjCloneUtil {
    public static<T> List<T> shallowCloneList(List<T> list){
        List<T> newList=new ArrayList<>();
        newList.addAll(list);
        return newList;
    }
    public static Map<String,Object> shallowCloneMap(Map<String,Object> map){
        Map<String,Object> newMap=new LinkedHashMap<>();
        newMap.putAll(map);
        return  newMap;
    }
    public static List<Map<String,Object>> shallowCloneMapList(List<Map<String,Object>> mapList){
        List<Map<String,Object>> newList=new ArrayList<>();
        mapList.forEach(v->{ newList.add(shallowCloneMap(v)); });
        return  newList;
    }
    public static JSONObject deepClone(Object obj){
        String objStr= JSON.toJSONString(obj);
        return JSON.parseObject(objStr);
    }
    public static JSONArray deepClone(List<Object> objList){
        String objStr= JSON.toJSONString(objList);
        return JSON.parseArray(objStr);
    }
    public static<T> T deepClone(T obj,Class<T> beanT){
        String objStr= JSON.toJSONString(obj);
        return JSON.parseObject(objStr,beanT);
    }
    public static<T> List<T> deepClone(List<T> objList,Class<T> beanT){
        String objStr= JSON.toJSONString(objList);
        return JSON.parseArray(objStr,beanT);
    }

}


/*
* 这种方法对于大部分简单类型（如String、Integer、Double等）以及可以被JSON序列化和反序列化的复杂对象（如自定义类，但其属性也必须是可序列化的类型）而言，确实可以实现深克隆的效果，因为它会创建原对象所有属性的新副本。

然而，需要注意以下几点限制：

对象的所有字段都必须是可以被JSON序列化的，这意味着包含不可序列化字段（如文件流、Socket对象、线程等）的类不能用此方法复制。
如果类中有循环引用的情况，即A对象引用了B对象，而B对象又直接或间接引用了A对象，这种方法可能会导致无限递归或者丢失部分引用信息。
对于一些特殊类型的处理可能不够精确，例如日期时间格式可能在序列化和反序列化过程中发生变化。
因此，尽管这种方法在很多场景下可用，但它并不适用于所有情况。对于那些具有特殊要求或包含不可序列化成员变量的对象，应当考虑使用其他深克隆技术，比如实现Cloneable接口并重写clone()方法，或者使用序列化（如Java自带的java.io.Serializable接口结合ObjectInputStream和ObjectOutputStream）等方式进行深克隆。
* */
